"""

pymysql  : 用于链接mysql的三方库
"""

import pymysql


class DB:

    def __init__(self, host, user, password, database):
        """

        初始化信息
        :param host:
        :param user:
        :param password:
        :param database:
        """
        self.host = host
        self.user = user
        self.password = password
        self.database = database

    def connect(self):
        """

        创建游标，用来执行sql的语句并获取结果
        :return:
        """
        self.conn = pymysql.connect(
            host=self.host,
            user=self.user,
            password=self.password,
            database=self.database,
            cursorclass=pymysql.cursors.DictCursor  # 返回一个字典的形式
        )
        self.cursor = self.conn.cursor()  # 创建一个游标，用于执行  SQL  和获取 结果

    def close(self):
        self.cursor.close()  # 关闭游标
        self.conn.close()  # 关闭数据库的链接

    def select_one(self, sql):

        self.connect()  # 链接数据库

        try:
            self.cursor.execute(sql)  # execute 会解析并且执行 sql 会将结果暂存到游标中
            result = self.cursor.fetchone()  # 使用 fetchone 获取一个结果
            return result
        except Exception as e:
            print(f'查询出错：{e}')  # 返回sql失败的原因
            return None
        finally:
            self.close()  # 一定要确保资源释放

    def select_all(self, sql):
        """

        执行sql语句，返回所有的匹配记录
        :param sql:
        :return:
        """
        self.connect()
        try:
            self.cursor.execute(sql)
            return self.cursor.fetchall()  # 获取所有的结果
        except Exception as e:
            print(f'查询出错{e}')
            return []  # 出错的时候，返回一个空的列表，避免程序崩溃
        finally:
            self.close()

    def _edit(self, sql):
        """

        _ 表示的是内部的方法（表示私有，不建议外部调用）
        :param sql:
        :return:
        """
        self.connect()
        try:
            self.cursor.execute(sql)
            self.conn.commit()  # 提交事务，将修改保存到数据库
            # commit  mysql是默认开启事务的，如果不用，修改只是一次性的，不会保存
            return '操作成功'
        except Exception as e:
            self.conn.rollback()  # 防止脏数据的写入
            return f'操作失败：{e}'
        finally:
            self.close()

    def insert(self, sql):
        return self._edit(sql)

    def update(self, sql):
        return self._edit(sql)

    def delect(self):
        return self._edit(self)

    """
    为什么封装三个方法，接口清晰，方便维护，知道啥是啥，便于扩展
    """


db = DB('Localhost', 'root', 'password', '数据库的名称')

user = db.select_one('select * from 表名 where id =1')
print(user)